﻿/*
* copyright to Tophy    2006/10/30
* 用于MsgPack包方式通信的XMLsocket
* 首尾字节包裹方式
* 
* */

import UnServer.*;

dynamic class UnServer.USocket{
	public static var say:Function;
	////////////////////////////////////////
	public var onData:Function;			//onData(MsgPack,String)
	public var onClose:Function;		//onClose();
	public var onConnect:Function;		//onConnect(boolean)
	public var onSend:Function;			//onSend(Boolean,String[MsgPack])
	////////////////////////////////////////
	private var socket:XMLSocket;
	private var me:USocket;
	//------------------------------
	public var ip:String;
	public var port:Number;
	public var connected:Boolean;
	public var connecting:Boolean;
	public var stChar:String;
	public var endChar:String;
	////////////////////////////////////////
	public function USocket(){
		var args:Array=arguments;
		ReSet();
		this.SetIPandPort(args);
		var s:String="";
		
	}
	private function SetIPandPort(args:Array){
		if(args.length>0){
			if(typeof(args[0])=="string" && args[0].indexOf(".")>=0){
				this.ip=args[0];
				if(args.length>1){
					if(Number(args[1]).toString()!="NaN" && Number(args[1])>1024){
						this.port=Number(args[1]);
					}else{
						Say("port可能不正确.["+args[1]+"]")
					}
				}
			}
			else if(typeof(args[0])=="number" && Number(args[0]).toString()!="NaN" ){
				if(Number(args[0])>1024){
					this.port=Number(args[0]);
					if(args.length>1){
						if(typeof(args[1])=="string" && args[1].indexOf(".")>=0){
							this.ip=args[1];
						}else{
							Say("ip可能不正确.["+args[1]+"]");
						}
					}
				}else{
					Say("port可能不正确.["+args[0]+"]")
				}
			}
			else if(Number(args[0]).toString()!="NaN" && args[0].indexOf(".")<0){
				if(Number(args[0])>1024){
					this.port=Number(args[0])
					if(args.length>1){
						if(typeof(args[1])=="string" && args[1].indexOf(".")>=0){
							this.ip=args[1];
						}else{
							Say("ip可能不正确.["+args[1]+"]");
						}
					}
				}else{
					Say("port可能不正确.["+args[0]+"]")
				}
			}
			else{
				Say("不明确的参数..["+args+"]");
			}
		}
	}
	///////////////  初始化参数
	public function ReSet(){
		this.me=this;
		this.port=-1;
		this.ip="";
		this.socket=new XMLSocket();
		this.connected=this.connecting=false;
		InitEVENTS();
	}
	private function InitEVENTS(){
		this.socket.onData=this.ONDATA;
		this.socket.onConnect=this.ONCONNECT;
		this.socket.onClose=this.ONCLOSE;
		this.socket["me"]=this.me;
	}
	//////////////////////////////////////////////////////////////////////////// 清空事件
	public function clearEvents(){
		this.onClose=this.onConnect=this.onData=null;
	}
	////////////////////////////////////////////////////////////////////////////  设置消息边界
	public function SetBorder(stchar:String,endchar:String){
		if(stchar==undefined || endchar==undefined) {
			Say("边界符不正确.["+arguments+"]");
		}else{
			this.stChar=stchar;
			this.endChar=endchar;
			Say("设置消息边界.["+arguments+"]");
		}
	}
	/////////////////////////////////////////////////////////////////////////////////   connect
	public function connect():Boolean{
		if(this.connected || this.connecting){
			Say("不能重复连接.");
			return false;
		}
		if(this.stChar==undefined || this.endChar==undefined){
			Say("消息包起止符未设置!");
			return false;
		}
		SetIPandPort(arguments);
		if(this.ip==undefined || this.ip=="" || this.port==undefined || this.port<=1024){
			Say("IP or Port 未设置，或不正确.");
			return false;
		}else{
			this.connecting=true;
			return this.socket.connect(this.ip,this.port);
		}
	}
	/////////////////////////////////////////////////////////////////////////////////   send
	public function send(){
		if(arguments.length>0){
			if(this.connected){
				var mp:MsgPack;
				var sendMsg:String;
				if(typeof(arguments[0])=="string"){
					sendMsg=this.stChar+arguments[0].toString()+this.endChar;
				}
				else if(typeof(arguments[0])=="object" && typeof(arguments[0].CommandCode)=="number"){
					sendMsg=this.stChar+arguments[0].toFullString()+this.endChar;
				}
				this.socket.send(sendMsg);
				if(this.onSend!=undefined){
					this.onSend(true,arguments[0]);
				}
			}else{
				Say("USocket未连接.");
				if(this.onSend!=undefined){
					this.onSend(false,arguments[0]);
				}
			}
		}else{
			Say("不能发送空消息.");
			if(this.onSend!=undefined){
				this.onSend(false,arguments[0]);
			}
		}
	}
	///////////////////////////////////////////////////////////////////////////////// 	close
	public function close(){
		if(this.connect){
			this.socket.close();
			delete this.socket;
			this.ReSet();
		}else{
			Say("未连接.");
		}
	}
	/////////////////////////////////////////////////////////////////////////////////   ONdata 事件
	private function ONDATA(info:String){
		var msgSt:String="";
		var mp:MsgPack;
		var indexs:Number=info.indexOf(this.me.stChar);
		var indexe:Number=info.indexOf(this.me.endChar);
		if(indexs<0 || indexe<0){
			Say("收到无边界消息错误！["+info+"]");
			return;
		}else{
			msgSt=info.substring(indexs+1,indexe);
		}
		if(msgSt!=""){
			mp=PraseFun.XmlPraseToMsgPack(msgSt);
		}
		if(mp!=null && mp!=undefined){
			if(this.me.onData!=undefined){
				this.me.onData(mp,info);
			}
		}
	}
	
	/////////////////////////////////////////////////////////////////////////////////   OnConnect 事件
	private function ONCONNECT(success:Boolean){
		this.me.connecting=false;
		this.me.connected=success;
		if(this.me.onConnect!=null && this.me.onConnect!=undefined){
			this.me.onConnect(success);
		}
	}
	/////////////////////////////////////////////////////////////////////////////////	OnClose 事件
	private function ONCLOSE(){
		this.me.connected=false;
		if(this.me.onClose!=null && this.me.onClose!=undefined){
			this.me.onClose();
		}
	}
	
	
	/////////////////////////////////////////////////////////////////////////////// Say
	private function Say(o:Object){
		var msg:String="USocket:"+o.toString();
		UnServer.USocket.say(msg);
	}
}
